package org.sky.algorithm.linear;

/**
 * 单链表
 *
 * @author fog
 * @date 2021/9/4
 */

public class Node {

    /**
     * 节点内容
     */
    int data;

    /**
     * 下一个节点
     */
    Node next;

    public Node(int data) {
        this.data = data;
    }

    /**
     * 为节点追回节点
     *
     * @return 下一个节点
     */
    public Node next() {
        return this.next;
    }

    /**
     * 为节点追回节点
     *
     * @param node 需要追加的节点
     */
    public Node append(Node node) {

        // 当前节点
        Node currentNode = this;

        // 循环向后找
        while (true) {
            // 取出下一个节点
            Node nextNode = currentNode.next;
            // 如果下一个为空，为最后一个节点
            if (nextNode == null) {
                break;
            }
            // 赋给当前节点
            currentNode = nextNode;
        }
        // 把需要追加的节点追加为找到的当前节点的下一个节点
        currentNode.next = node;

        return this;

    }

    /**
     * 获取节点中的数据
     *
     * @return 节点数据
     */
    public int getData() {
        return this.data;
    }

    /**
     * 显示所有节点
     */
    public void show() {
        Node currentNode = this;
        while (true) {
            System.out.print(currentNode.data + " ---> ");
            currentNode = currentNode.next;

            if (currentNode == null) {
                break;
            }
        }
    }

    /**
     * 插入一个节点
     *
     * @param node 需要插入的节点
     */
    public void addNode(Node node) {

        // 取出下一个节点
        Node nextNode = next;
        // 把新的节点作为当节点的下一个节点
        this.next = node;
        // 把取出的节点赋给插入的节点的下一个节点
        node.next = nextNode;

    }

    /**
     * 删除下一个节点
     */
    public void removeNext() {
        // 去除下下个节点赋给当前节点的下一个节点
        this.next = next.next;
    }

    /**
     * 当前节点是否为追后一个节点
     *
     * @return Boolean
     */
    public boolean isLast() {
        return next == null;
    }
}
